Go 的 for 坑
切片遍历的优化
遍历 slice
下面函数通过遍历切片,打印切片的下标和元素值,请问性能上有没有可优化的空间?
func RangeSlice(slice []int) {
for index, value := range slice {
// 这里忽略函数的实际意义
_, _ = index, value
}
}
遍历过程中每次迭代会对 index 和 value 进行赋值,如果数据量大或者 value 类型为 string 时,对 value 的赋值操作可能是多余的,可以在 for-range
中忽略 value 值,使用 slice[index]
引用 value 值。
遍历 map
下面函数通过遍历Map,打印Map的key和value,请问性能上有没有可优化的空间?
func RangeMap(myMap map[int]string) {
for key, _ := range myMap {
// 这里忽略函数的实际意义
_, _ = key, myMap[key]
}
}
函数中 for-range 语句中只获取 key 值,然后跟据 key 值获取 value 值,虽然看似减少了一次赋值,但通过 key 值查找 value 值的性能消耗可能高于赋值消耗。能否优化取决于 map 所存储数据结构特征、结合实际情况进行。
动态遍历
请问如下程序是否能正常结束?
func main() {
v := []int{1, 2, 3}
for i:= range v {
v = append(v, i)
}
}
能够正常结束。循环内改变切片的长度,不影响循环次数,循环次效在循环开始前就已经确定了。